/**
  ******************************************************************************
  * @file    sym32l010_hal_crc.c
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   CRC HAL module driver.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_crc.h"


/*******************************************************************************
  * @brief  采用8bit方式，计算CRC16
  * @param  Mode:  CRC 算法
  *                @arg CRC16_IBM
  *                @arg CRC16_MAXIM
  *                @arg CRC16_USB
  *                @arg CRC16_MODBUS
  *                @arg CRC16_CCITT
  *                @arg CRC16_CCITTFALSE
  *                @arg CRC16_X25
  *                @arg CRC16_XMODEM
  * @param  pByteBuf: 待计算CRC的数据的指针
  * @param  ByteCnt : 待计算CRC的数据的数量(字节数)
  * @retval CRC 计算结果
  */
uint16_t HAL_CRC_Calc_8bit(CRC_ModeTypeDef Mode, uint8_t *pByteBuf, uint32_t ByteCnt)
{
    SYM_CRC->CR = (uint32_t)Mode;
    while (ByteCnt)
    {
        SYM_CRC->DR = *pByteBuf;
        pByteBuf++;
        ByteCnt--;
    }
    return SYM_CRC->RESULT;
}


/*******************************************************************************
  * @brief  CRC32 ISO-HDLC软算法
  * @param  pByteBuf: 待计算CRC的数据的指针
  * @param  ByteCnt : 待计算CRC的数据的数量(字节数)
  * @retval CRC 计算结果
  */
uint32_t HAL_CRC32_Default_Calc_Firmware(uint8_t *pByteBuf, uint32_t ByteCnt)
{
    uint32_t crc = 0xFFFFFFFF;

    while (ByteCnt--)
    {
        crc ^= ((uint32_t)*pByteBuf);
        pByteBuf++;
        for (uint32_t i=0; i<8; i++)
        {
            if (crc & 1)
            {
                crc = (crc >> 1) ^ 0xEDB88320;
            }
            else
            {
                crc = (crc >> 1);
            }
        }
    }
    return (~crc);
}


/*******************************************************************************
  * @brief  CRC32 MPEG-2软算法
  * @param  pByteBuf: 待计算CRC的数据的指针
  * @param  ByteCnt : 待计算CRC的数据的数量(字节数)
  * @retval CRC 计算结果
  */
uint32_t HAL_CRC32_Mpeg2_Calc_Firmware(uint8_t *pByteBuf, uint32_t ByteCnt)
{
    uint32_t crc = 0xFFFFFFFF;

    while (ByteCnt--)
    {
        crc ^= (((uint32_t)(*pByteBuf)) << 24);
        pByteBuf++;
        for (uint32_t i=0; i<8; i++)
        {
            if (crc & 0x80000000)
            {
                crc = (crc << 1) ^ 0x04C11DB7;
            }
            else
            {
                crc = (crc << 1);
            }
        }
    }
    return crc;
}


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
